const { getUserInfo } = require('../service/user.service')
const { userFormateError, userAlreadyExisted, userRegisterError, userUnExist, userLoginError, invalidPassword } = require('../constant/err.type')
// 加密的库
const bcrypt = require('bcryptjs')
const userValidator = async (ctx, next) => {
    const { username, password } = ctx.request.body
    console.log(username,password)
    // 合法性
    if (!username || !password) {
        console.log('用户名或密码为空', ctx.request.body)

        // 封装了错误信息 ctx.app.emit在提示错误信息时使用
        ctx.app.emit('error', userFormateError, ctx)
        return
    }
    await next()
}

// 用户是否存在
const verifyUser = async (ctx, next) => {
    // 合理性
    const { username } = ctx.request.body
    try {
        const isExist = await getUserInfo({ username })
        if (isExist) {
            // 记录日志信息
            console.error('用户名存在', { username })
            ctx.app.emit('error', userAlreadyExisted, ctx)
            return
        }
        await next()

    } catch (err) {
        ctx.app.emit('error', userRegisterError, ctx)
        console.error('获取用户信息失败', err)
        return
    }

}

const cryptPassword = async (ctx, next) => {
    // 解构出密码
    const { password } = ctx.request.body
    // 
    const salt = bcrypt.genSaltSync(10)
    // 保存的是密文
    const hash = bcrypt.hashSync(password, salt)
    ctx.request.body.password = hash
    await next()
}
const verifyLogin = async (ctx, next) => {
    // 1.判断用户是否存在 不存在报错
    const { username, password } = ctx.request.body
    try {
        const res = await getUserInfo({ username })
        if (!res) {
            console.error('用户不存在', { username })
            ctx.app.emit('error', userUnExist, ctx)
            return
        }
        console.log(bcrypt.compareSync(password, res.password),'ssss')
        // 2.密码是否匹配 不匹配报错
        // compareSync 返回值是 true false
        if (!bcrypt.compareSync(password, res.password)) {
             ctx.app.emit('error', invalidPassword, ctx)
             return
        }
    } catch (err) {
        console.error(err)
        return ctx.app.emit('error', userLoginError)
    }

    await next()
}
module.exports = {
    userValidator, verifyUser, cryptPassword, verifyLogin
}